package com.tjcd.project.library_base.common.utils;

import android.content.Context;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.blankj.utilcode.util.LogUtils;

public class GDLocationUtil {
    public static GDLocationUtil instance;
    // 定位
    private static AMapLocationClient mlocationClient;
    // 配置
    public static AMapLocationClientOption mLocationOption;
    private static MyLocationListener mMyLocationListener;

    public static void setMyLocationListener(MyLocationListener myLocationListener) {
        mMyLocationListener = myLocationListener;
        startLocation();
    }

//    private GDLocationUtil(Context context) {
//        initLocation(context);
//    }

    //采用Double CheckLock(DCL)实现单例
//    public static GDLocationUtil getInstance(Context context) {
//        if (instance == null) {
//            synchronized (GDLocationUtil.class) {
//                if (instance == null) {
//                    instance = new GDLocationUtil(context);
//                }
//            }
//        }
//        return instance;
//    }

    /**
     * 定位回调
     */
    public interface MyLocationListener {
        void localRelsult(AMapLocation location);
    }

    /**
     * 初始化定位
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    public static void initLocation(Context context) {
        try {
            mlocationClient = new AMapLocationClient(context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 初始化定位参数
        mLocationOption = new AMapLocationClientOption();

        // 设置场景为出行
        mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.Transport);
        // 设置定位模式为高精度模式，Battery_Saving为低功耗模式，Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//        mLocationOption.setGpsFirst(true);
        // 设置返回地址信息
//        mLocationOption.setNeedAddress(true);
        // 设置定位间隔,单位毫秒,默认为2000ms
//        mLocationOption.setInterval(2000);
//        mLocationOption.setOnceLocation(true);
        mLocationOption.setLocationCacheEnable(false);
        mLocationOption.setOnceLocationLatest(true);
        // 设置定位参数
        mlocationClient.setLocationOption(mLocationOption);
//        mLocationOption.setLocationCacheEnable(false);

        //初始化client
        try {
//            mlocationClient = new AMapLocationClient(context.getApplicationContext());
//            mLocationOption = getDefaultOption();
//            //设置定位参数
//            mlocationClient.setLocationOption(mLocationOption);
            // 设置定位监听
//            mlocationClient.setLocationListener(new AMapLocationListener() {
//                @Override
//                public void onLocationChanged(AMapLocation aMapLocation) {
//                    if (aMapLocation.getErrorCode() == 0) {
//                        //可在其中解析amapLocation获取相应内容。
//                        LogUtils.e("asd = " + aMapLocation.toStr());
//                        SugarSpConst.setLocation(aMapLocation);
//                        stopLocation();
//                    }
//                    if (null != mMyLocationListener){
//                        mMyLocationListener.localRelsult(aMapLocation);
//                    }
//                }
//            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void getCurrentLocation(){
        mlocationClient.setLocationListener(new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation aMapLocation) {
                if (aMapLocation.getErrorCode() == 0) {
                    stopLocation();
                    //可在其中解析amapLocation获取相应内容。
                    LogUtils.e("asd = " + aMapLocation.toStr());
//                    SugarSpConst.setLocation(aMapLocation);
                }
                if (null != mMyLocationListener){
                    mMyLocationListener.localRelsult(aMapLocation);
                }
            }
        });
        mlocationClient.startLocation();
    }

    /**
     * 默认的定位参数
     *
     * @since 2.8.0
     */
    private AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选，设置定位模式，可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(true);//可选，设置是否gps优先，只在高精度模式下有效。默认关闭
//        mOption.setHttpTimeOut(30000);//可选，设置网络请求超时时间。默认为30秒。在仅设备模式下无效
//        mOption.setInterval(1000 * 3);//可选，设置定位间隔。默认为3秒
        mOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
        mOption.setNeedAddress(true);//可选，设置是否返回逆地理地址信息。默认是true
//        mOption.setOnceLocation(true);//可选，设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(true);//可选，设置是否等待wifi刷新，默认为false.如果设置为true,会自动变为单次定位，持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选， 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
//        mOption.setSensorEnable(false);//可选，设置是否使用传感器。默认是false
//        mOption.setWifiScan(true); //可选，设置是否开启wifi扫描。默认为true，如果设置为false会同时停止主动刷新，停止以后完全依赖于系统刷新，定位位置可能存在误差
//        mOption.setLocationCacheEnable(false); //可选，设置是否使用缓存定位，默认为true
        mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);//可选，设置逆地理信息的语言，默认值为默认语言（根据所在地区选择语言）
        return mOption;
    }


    public static void startLocation() {
        mlocationClient.startLocation();
    }

    public static void stopLocation() {
        if (null != mlocationClient){
            mlocationClient.stopLocation();
        }
    }
}